home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Developers / ANSI folder / INTO Libraries ƒ / MacOS 68K ƒ / SANE Sources ƒ / SANE.c < prev   
Encoding:
C/C++ Source or Header  |  1994-05-03  |  3.9 KB  |  237 lines  |  [TEXT/MMCC]

  1. #include <Types.h>
  2. #include <SANE.h>
  3. #include <Assembler.h>
  4.  
  5. #if __MC68881__
  6.  
  7. short    __inf__[6]    =    { 0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000 };
  8. short    __pi__[6]    =     { 0x4000,0x0000,0xC90F,0xDAA2,0x2168,0xC235 };
  9.  
  10. #else
  11.  
  12. short    __inf__[5]    =    { 0x7FFF,0x0000,0x0000,0x0000,0x0000 };
  13. short    __pi__[5]    =    { 0x4000,0xC90F,0xDAA2,0x2168,0xC235 };
  14.  
  15. #endif
  16.  
  17. asm void x96tox80(extended96 *x96,extended80 *x)
  18. {
  19.     move.l    4(sp),a0
  20.     move.l    8(sp),a1
  21.     move.w    (a0)+,(a1)+
  22.     addq.w    #2,a0
  23.     move.l    (a0)+,(a1)+
  24.     move.l    (a0),(a1)
  25.     rts
  26. }
  27.  
  28. asm void x80tox96(extended80 *x80,extended96 *x96)
  29. {
  30.     move.l    4(sp),a0
  31.     move.l    8(sp),a1
  32.     move.w    (a0)+,(a1)+
  33.     clr.w    (a1)+
  34.     move.l    (a0)+,(a1)+
  35.     move.l    (a0),(a1)
  36.     rts
  37. }
  38.  
  39. asm void Remainder(extended80 *source,extended80 *dest,short *quot)
  40. {
  41.     move.l    4(sp),-(sp)
  42.     move.l    12(sp),-(sp)
  43.     move.w    #0x000C,-(sp)    /* FREMX */
  44.     _FP68K
  45.     move.l    12(sp),a0
  46.     move.w    d0,(a0)
  47.     rts
  48. }
  49.  
  50. asm RelOp Relation(extended80 *source,extended80 *dest)
  51. {
  52.     move.l    4(sp),-(sp)
  53.     move.l    12(sp),-(sp)
  54.     move.w    #0x000A,-(sp)    /* FCPXX */
  55.     _FP68K
  56.     bne.s    L0
  57.     moveq    #EqualTo,d0
  58.     rts
  59. L0:    bvc.s    L1
  60.     moveq    #Unordered,d0
  61.     rts
  62. L1:    bmi.s    L2
  63.     moveq    #GreaterThan,d0
  64.     rts
  65. L2:    moveq    #LessThan,d0
  66.     rts
  67. }
  68.  
  69. asm short SignNum(extended80 x)
  70. {
  71.     pea        zeroword
  72.     pea        8(sp)
  73.     move.w    #0x2008,-(sp)    /* FCMPIX */
  74.     _FP68K
  75.     bne.s    L0
  76.     moveq    #0,d0
  77.     rts
  78. zeroword:
  79.     dc.w    0
  80. L0:    bmi.s    L1
  81.     moveq    #1,d0
  82.     rts
  83. L1:    moveq    #-1,d0
  84.     rts
  85. }
  86.  
  87. #if    __MC68881__
  88.  
  89. asm RoundDir GetRound(void)
  90. {
  91.     DC.W    0xF200,0xB000    //    FMOVE    FPCR,D0
  92.     ANDI.W    #0x0030,D0
  93.     ROR.B    #4,D0
  94.     MOVE.B    L0(D0.W),D0
  95.     RTS
  96. L0:    DC.W    0x0003,0x0201
  97. }
  98.  
  99. asm void SetRound(RoundDir r)
  100. {
  101.     MOVEQ    #0,D0
  102.     MOVE.W    4(sp),D0
  103.     ANDI.W    #0x0003,D0
  104.     DC.W    0xF201,0xB000    //    FMOVE    FPCR,D1
  105.     ANDI.B    #0xCF,D1
  106.     OR.B    L0(D0.W),D1
  107.     DC.W    0xF201,0x9000    //    FMOVE    D1,FPCR
  108.     RTS
  109. L0:    DC.W    0x0030,0x2010
  110. }
  111.  
  112. asm RoundPre GetPrecision(void)
  113. {
  114.     DC.W    0xF200,0xB000    //    FMOVE    FPCR,D0
  115.     ANDI.W    #0x00C0,D0
  116.     ROR.B    #6,D0
  117.     MOVE.B    L0(D0.W),D0
  118.     RTS
  119. L0:    DC.W    0x0002,0x0103
  120. }
  121.  
  122. asm void SetPrecision(RoundPre p)
  123. {
  124.     MOVEQ    #0,D0
  125.     MOVE.W    4(sp),D0
  126.     ANDI.W    #0x0003,D0
  127.     DC.W    0xF201,0xB000    //    FMOVE    FPCR,D1
  128.     ANDI.B    #0x3F,D1
  129.     OR.B    L0(D0.W),D1
  130.     DC.W    0xF201,0x9000    //    FMOVE    D1,FPCR
  131.     RTS
  132. L0:    DC.W    0x0080,0x80C0
  133. }
  134.  
  135. asm extended NAN(short n)
  136. {
  137.     move.w    4(sp),d0            //    n
  138.     bne.s    L0
  139.     moveq    #15,d0
  140. L0:    addi.w    #0x4000,d0
  141.     clr.l    -(sp)                //    push NAN(n) onto stack
  142.     clr.w    -(sp)
  143.     move.w    d0,-(sp)
  144.     move.l    #0x7FFF7FFF,-(sp)
  145.     dc.w    0xF21F,0x4800        //    FMOVE.X    (SP)+,FP0
  146.     rts
  147. }
  148.  
  149. /*
  150. static asm void SetGetHalt(void)
  151. {
  152.     dc.w    0x0C40,0x0000,0x6712,0x0C40,0x0001,0x673C,0x0C40,0x0002,
  153.     dc.w    0x674A,0x303C,0xFE16,0xA9C9,0xF280,0x0000,0x2208,0xF327,
  154.     dc.w    0xF200,0xA800,0x8041,0xF200,0x8800,0xF200,0xB000,0xC041,
  155.     dc.w    0x0280,0x0000,0xFF00,0x670C,0x7000,0x102F,0x0001,0x08B7,
  156.     dc.w    0x0003,0x0000,0xF35F,0x4E75,0x327C,0x00C0,0x20D9,0x20D9,
  157.     dc.w    0x20D9,0x20D9,0x20D9,0x20D9,0x20D9,0x4E75,0x327C,0x00C0,
  158.     dc.w    0x22D8,0x22D8,0x22D8,0x22D8,0x22D8,0x22D8,0x22D8,0x4E75,
  159.     dc.w    0x48E7,0x80C0,0x303C,0xA097,0xA346,0x2248,0x303C,0xA89F,
  160.     dc.w    0xA346,0xB3C8,0x6618,0x7070,0xA51E,0x6B1A,0x2248,0x41FA,
  161.     dc.w    0xFF70,0x7070,0xA02E,0x2049,0x303C,0xA097,0xA247,0x4CDF,
  162.     dc.w    0x0301,0xA097,0x4E75,0x303C,0xFE16,0xA9C9
  163. }
  164. */
  165.  
  166. asm void GetTrapVector(TrapVector *tv)
  167. {
  168.     lea        0x00c0,a0
  169.     move.l    4(sp),a1
  170.     moveq    #7-1,d0
  171. l0:    move.l    (a0)+,(a1)+
  172.     dbf        d0,l0
  173.     rts
  174. }
  175.  
  176. asm void SetTrapVector(TrapVector *tv)
  177. {
  178.     move.l    4(sp),a0
  179.     lea        0x00c0,a1
  180.     moveq    #7-1,d0
  181. l0:    move.l    (a0)+,(a1)+
  182.     dbf        d0,l0
  183.     rts
  184. }
  185.  
  186. #else
  187.  
  188. void SetRound(RoundDir r)
  189. {
  190.     Environment ev;
  191.  
  192.     GetEnvironment(&ev);
  193.     ev=(ev&0xFF9F)|((r&3)<<12);
  194.     SetEnvironment(&ev);
  195. }
  196.  
  197. RoundDir GetRound(void)
  198. {
  199.     Environment ev;
  200.  
  201.     GetEnvironment(&ev);
  202.     return((ev>>12)&3);
  203. }
  204.  
  205. void SetPrecision(RoundPre r)
  206. {
  207.     Environment ev;
  208.  
  209.     GetEnvironment(&ev);
  210.     ev=(ev&0xFF9F)|((r&3)<<5);
  211.     SetEnvironment(&ev);
  212. }
  213.  
  214. RoundPre GetPrecision(void)
  215. {
  216.     Environment ev;
  217.  
  218.     GetEnvironment(&ev);
  219.     return((ev>>5)&3);
  220. }
  221.  
  222. asm extended NAN(short n)
  223. {
  224.     move.w    8(sp),d0        /* n */
  225.     bne.s    L0
  226.     moveq    #15,d0
  227. L0:    addi.w    #0x4000,d0
  228.     move.l    4(sp),a0        /* address of return extended */
  229.     move.w    #0x7FFF,(a0)+
  230.     move.w    d0,(a0)+
  231.     clr.l    (a0)+
  232.     clr.w    (a0)+
  233.     rts
  234. }
  235.  
  236. #endif
  237.